home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / wm97xx.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  10.2 KB  |  316 lines

  1.  
  2. /*
  3.  * Register bits and API for Wolfson WM97xx series of codecs
  4.  */
  5.  
  6. #ifndef _LINUX_WM97XX_H
  7. #define _LINUX_WM97XX_H
  8.  
  9. #include <sound/core.h>
  10. #include <sound/pcm.h>
  11. #include <sound/ac97_codec.h>
  12. #include <sound/initval.h>
  13. #include <linux/types.h>
  14. #include <linux/list.h>
  15. #include <linux/input.h>    /* Input device layer */
  16. #include <linux/platform_device.h>
  17.  
  18. /*
  19.  * WM97xx AC97 Touchscreen registers
  20.  */
  21. #define AC97_WM97XX_DIGITISER1        0x76
  22. #define AC97_WM97XX_DIGITISER2        0x78
  23. #define AC97_WM97XX_DIGITISER_RD     0x7a
  24. #define AC97_WM9713_DIG1        0x74
  25. #define AC97_WM9713_DIG2        AC97_WM97XX_DIGITISER1
  26. #define AC97_WM9713_DIG3        AC97_WM97XX_DIGITISER2
  27.  
  28. /*
  29.  * WM97xx register bits
  30.  */
  31. #define WM97XX_POLL        0x8000    /* initiate a polling measurement */
  32. #define WM97XX_ADCSEL_X        0x1000    /* x coord measurement */
  33. #define WM97XX_ADCSEL_Y        0x2000    /* y coord measurement */
  34. #define WM97XX_ADCSEL_PRES    0x3000    /* pressure measurement */
  35. #define WM97XX_ADCSEL_MASK    0x7000
  36. #define WM97XX_COO        0x0800    /* enable coordinate mode */
  37. #define WM97XX_CTC        0x0400    /* enable continuous mode */
  38. #define WM97XX_CM_RATE_93    0x0000    /* 93.75Hz continuous rate */
  39. #define WM97XX_CM_RATE_187    0x0100    /* 187.5Hz continuous rate */
  40. #define WM97XX_CM_RATE_375    0x0200    /* 375Hz continuous rate */
  41. #define WM97XX_CM_RATE_750    0x0300    /* 750Hz continuous rate */
  42. #define WM97XX_CM_RATE_8K    0x00f0    /* 8kHz continuous rate */
  43. #define WM97XX_CM_RATE_12K    0x01f0    /* 12kHz continuous rate */
  44. #define WM97XX_CM_RATE_24K    0x02f0    /* 24kHz continuous rate */
  45. #define WM97XX_CM_RATE_48K    0x03f0    /* 48kHz continuous rate */
  46. #define WM97XX_CM_RATE_MASK    0x03f0
  47. #define WM97XX_RATE(i)        (((i & 3) << 8) | ((i & 4) ? 0xf0 : 0))
  48. #define WM97XX_DELAY(i)        ((i << 4) & 0x00f0)    /* sample delay times */
  49. #define WM97XX_DELAY_MASK    0x00f0
  50. #define WM97XX_SLEN        0x0008    /* slot read back enable */
  51. #define WM97XX_SLT(i)        ((i - 5) & 0x7)    /* panel slot (5-11) */
  52. #define WM97XX_SLT_MASK        0x0007
  53. #define WM97XX_PRP_DETW        0x4000    /* detect on, digitise off, wake */
  54. #define WM97XX_PRP_DET        0x8000    /* detect on, digitise off, no wake */
  55. #define WM97XX_PRP_DET_DIG    0xc000    /* setect on, digitise on */
  56. #define WM97XX_RPR        0x2000    /* wake up on pen down */
  57. #define WM97XX_PEN_DOWN        0x8000    /* pen is down */
  58. #define WM97XX_ADCSRC_MASK    0x7000    /* ADC source mask */
  59.  
  60. #define WM97XX_AUX_ID1        0x8001
  61. #define WM97XX_AUX_ID2        0x8002
  62. #define WM97XX_AUX_ID3        0x8003
  63. #define WM97XX_AUX_ID4        0x8004
  64.  
  65.  
  66. /* WM9712 Bits */
  67. #define WM9712_45W        0x1000    /* set for 5-wire touchscreen */
  68. #define WM9712_PDEN        0x0800    /* measure only when pen down */
  69. #define WM9712_WAIT        0x0200    /* wait until adc is read before next sample */
  70. #define WM9712_PIL        0x0100    /* current used for pressure measurement. set 400uA else 200uA */
  71. #define WM9712_MASK_HI        0x0040    /* hi on mask pin (47) stops conversions */
  72. #define WM9712_MASK_EDGE    0x0080    /* rising/falling edge on pin delays sample */
  73. #define    WM9712_MASK_SYNC    0x00c0    /* rising/falling edge on mask initiates sample */
  74. #define WM9712_RPU(i)        (i&0x3f)    /* internal pull up on pen detect (64k / rpu) */
  75. #define WM9712_PD(i)        (0x1 << i)    /* power management */
  76.  
  77. /* WM9712 Registers */
  78. #define AC97_WM9712_POWER    0x24
  79. #define AC97_WM9712_REV        0x58
  80.  
  81. /* WM9705 Bits */
  82. #define WM9705_PDEN        0x1000    /* measure only when pen is down */
  83. #define WM9705_PINV        0x0800    /* inverts sense of pen down output */
  84. #define WM9705_BSEN        0x0400    /* BUSY flag enable, pin47 is 1 when busy */
  85. #define WM9705_BINV        0x0200    /* invert BUSY (pin47) output */
  86. #define WM9705_WAIT        0x0100    /* wait until adc is read before next sample */
  87. #define WM9705_PIL        0x0080    /* current used for pressure measurement. set 400uA else 200uA */
  88. #define WM9705_PHIZ        0x0040    /* set PHONE and PCBEEP inputs to high impedance */
  89. #define WM9705_MASK_HI        0x0010    /* hi on mask stops conversions */
  90. #define WM9705_MASK_EDGE    0x0020    /* rising/falling edge on pin delays sample */
  91. #define    WM9705_MASK_SYNC    0x0030    /* rising/falling edge on mask initiates sample */
  92. #define WM9705_PDD(i)        (i & 0x000f)    /* pen detect comparator threshold */
  93.  
  94.  
  95. /* WM9713 Bits */
  96. #define WM9713_PDPOL        0x0400    /* Pen down polarity */
  97. #define WM9713_POLL        0x0200    /* initiate a polling measurement */
  98. #define WM9713_CTC        0x0100    /* enable continuous mode */
  99. #define WM9713_ADCSEL_X        0x0002    /* X measurement */
  100. #define WM9713_ADCSEL_Y        0x0004    /* Y measurement */
  101. #define WM9713_ADCSEL_PRES    0x0008    /* Pressure measurement */
  102. #define WM9713_COO        0x0001    /* enable coordinate mode */
  103. #define WM9713_45W        0x1000  /* set for 5 wire panel */
  104. #define WM9713_PDEN        0x0800    /* measure only when pen down */
  105. #define WM9713_ADCSEL_MASK    0x00fe    /* ADC selection mask */
  106. #define WM9713_WAIT        0x0200    /* coordinate wait */
  107.  
  108. /* AUX ADC ID's */
  109. #define TS_COMP1        0x0
  110. #define TS_COMP2        0x1
  111. #define TS_BMON            0x2
  112. #define TS_WIPER        0x3
  113.  
  114. /* ID numbers */
  115. #define WM97XX_ID1        0x574d
  116. #define WM9712_ID2        0x4c12
  117. #define WM9705_ID2        0x4c05
  118. #define WM9713_ID2        0x4c13
  119.  
  120. /* Codec GPIO's */
  121. #define WM97XX_MAX_GPIO        16
  122. #define WM97XX_GPIO_1        (1 << 1)
  123. #define WM97XX_GPIO_2        (1 << 2)
  124. #define WM97XX_GPIO_3        (1 << 3)
  125. #define WM97XX_GPIO_4        (1 << 4)
  126. #define WM97XX_GPIO_5        (1 << 5)
  127. #define WM97XX_GPIO_6        (1 << 6)
  128. #define WM97XX_GPIO_7        (1 << 7)
  129. #define WM97XX_GPIO_8        (1 << 8)
  130. #define WM97XX_GPIO_9        (1 << 9)
  131. #define WM97XX_GPIO_10        (1 << 10)
  132. #define WM97XX_GPIO_11        (1 << 11)
  133. #define WM97XX_GPIO_12        (1 << 12)
  134. #define WM97XX_GPIO_13        (1 << 13)
  135. #define WM97XX_GPIO_14        (1 << 14)
  136. #define WM97XX_GPIO_15        (1 << 15)
  137.  
  138.  
  139. #define AC97_LINK_FRAME        21    /* time in uS for AC97 link frame */
  140.  
  141.  
  142. /*---------------- Return codes from sample reading functions ---------------*/
  143.  
  144. /* More data is available; call the sample gathering function again */
  145. #define RC_AGAIN            0x00000001
  146. /* The returned sample is valid */
  147. #define RC_VALID            0x00000002
  148. /* The pen is up (the first RC_VALID without RC_PENUP means pen is down) */
  149. #define RC_PENUP            0x00000004
  150. /* The pen is down (RC_VALID implies RC_PENDOWN, but sometimes it is helpful
  151.    to tell the handler that the pen is down but we don't know yet his coords,
  152.    so the handler should not sleep or wait for pendown irq) */
  153. #define RC_PENDOWN            0x00000008
  154.  
  155. /*
  156.  * The wm97xx driver provides a private API for writing platform-specific
  157.  * drivers.
  158.  */
  159.  
  160. /* The structure used to return arch specific sampled data into */
  161. struct wm97xx_data {
  162.     int x;
  163.     int y;
  164.     int p;
  165. };
  166.  
  167. /*
  168.  * Codec GPIO status
  169.  */
  170. enum wm97xx_gpio_status {
  171.     WM97XX_GPIO_HIGH,
  172.     WM97XX_GPIO_LOW
  173. };
  174.  
  175. /*
  176.  * Codec GPIO direction
  177.  */
  178. enum wm97xx_gpio_dir {
  179.     WM97XX_GPIO_IN,
  180.     WM97XX_GPIO_OUT
  181. };
  182.  
  183. /*
  184.  * Codec GPIO polarity
  185.  */
  186. enum wm97xx_gpio_pol {
  187.     WM97XX_GPIO_POL_HIGH,
  188.     WM97XX_GPIO_POL_LOW
  189. };
  190.  
  191. /*
  192.  * Codec GPIO sticky
  193.  */
  194. enum wm97xx_gpio_sticky {
  195.     WM97XX_GPIO_STICKY,
  196.     WM97XX_GPIO_NOTSTICKY
  197. };
  198.  
  199. /*
  200.  * Codec GPIO wake
  201.  */
  202. enum wm97xx_gpio_wake {
  203.     WM97XX_GPIO_WAKE,
  204.     WM97XX_GPIO_NOWAKE
  205. };
  206.  
  207. /*
  208.  * Digitiser ioctl commands
  209.  */
  210. #define WM97XX_DIG_START    0x1
  211. #define WM97XX_DIG_STOP        0x2
  212. #define WM97XX_PHY_INIT        0x3
  213. #define WM97XX_AUX_PREPARE    0x4
  214. #define WM97XX_DIG_RESTORE    0x5
  215.  
  216. struct wm97xx;
  217.  
  218. extern struct wm97xx_codec_drv wm9705_codec;
  219. extern struct wm97xx_codec_drv wm9712_codec;
  220. extern struct wm97xx_codec_drv wm9713_codec;
  221.  
  222. /*
  223.  * Codec driver interface - allows mapping to WM9705/12/13 and newer codecs
  224.  */
  225. struct wm97xx_codec_drv {
  226.     u16 id;
  227.     char *name;
  228.  
  229.     /* read 1 sample */
  230.     int (*poll_sample) (struct wm97xx *, int adcsel, int *sample);
  231.  
  232.     /* read X,Y,[P] in poll */
  233.     int (*poll_touch) (struct wm97xx *, struct wm97xx_data *);
  234.  
  235.     int (*acc_enable) (struct wm97xx *, int enable);
  236.     void (*phy_init) (struct wm97xx *);
  237.     void (*dig_enable) (struct wm97xx *, int enable);
  238.     void (*dig_restore) (struct wm97xx *);
  239.     void (*aux_prepare) (struct wm97xx *);
  240. };
  241.  
  242.  
  243. /* Machine specific and accelerated touch operations */
  244. struct wm97xx_mach_ops {
  245.  
  246.     /* accelerated touch readback - coords are transmited on AC97 link */
  247.     int acc_enabled;
  248.     void (*acc_pen_up) (struct wm97xx *);
  249.     int (*acc_pen_down) (struct wm97xx *);
  250.     int (*acc_startup) (struct wm97xx *);
  251.     void (*acc_shutdown) (struct wm97xx *);
  252.  
  253.     /* interrupt mask control - required for accelerated operation */
  254.     void (*irq_enable) (struct wm97xx *, int enable);
  255.  
  256.     /* GPIO pin used for accelerated operation */
  257.     int irq_gpio;
  258.  
  259.     /* pre and post sample - can be used to minimise any analog noise */
  260.     void (*pre_sample) (int);  /* function to run before sampling */
  261.     void (*post_sample) (int);  /* function to run after sampling */
  262. };
  263.  
  264. struct wm97xx {
  265.     u16 dig[3], id, gpio[6], misc;    /* Cached codec registers */
  266.     u16 dig_save[3];        /* saved during aux reading */
  267.     struct wm97xx_codec_drv *codec;    /* attached codec driver*/
  268.     struct input_dev *input_dev;    /* touchscreen input device */
  269.     struct snd_ac97 *ac97;        /* ALSA codec access */
  270.     struct device *dev;        /* ALSA device */
  271.     struct platform_device *battery_dev;
  272.     struct platform_device *touch_dev;
  273.     struct wm97xx_mach_ops *mach_ops;
  274.     struct mutex codec_mutex;
  275.     struct delayed_work ts_reader;  /* Used to poll touchscreen */
  276.     unsigned long ts_reader_interval; /* Current interval for timer */
  277.     unsigned long ts_reader_min_interval; /* Minimum interval */
  278.     unsigned int pen_irq;        /* Pen IRQ number in use */
  279.     struct workqueue_struct *ts_workq;
  280.     struct work_struct pen_event_work;
  281.     u16 acc_slot;            /* AC97 slot used for acc touch data */
  282.     u16 acc_rate;            /* acc touch data rate */
  283.     unsigned pen_is_down:1;        /* Pen is down */
  284.     unsigned aux_waiting:1;        /* aux measurement waiting */
  285.     unsigned pen_probably_down:1;    /* used in polling mode */
  286.     u16 suspend_mode;               /* PRP in suspend mode */
  287. };
  288.  
  289. /*
  290.  * Codec GPIO access (not supported on WM9705)
  291.  * This can be used to set/get codec GPIO and Virtual GPIO status.
  292.  */
  293. enum wm97xx_gpio_status wm97xx_get_gpio(struct wm97xx *wm, u32 gpio);
  294. void wm97xx_set_gpio(struct wm97xx *wm, u32 gpio,
  295.               enum wm97xx_gpio_status status);
  296. void wm97xx_config_gpio(struct wm97xx *wm, u32 gpio,
  297.                      enum wm97xx_gpio_dir dir,
  298.                      enum wm97xx_gpio_pol pol,
  299.                      enum wm97xx_gpio_sticky sticky,
  300.                      enum wm97xx_gpio_wake wake);
  301.  
  302. void wm97xx_set_suspend_mode(struct wm97xx *wm, u16 mode);
  303.  
  304. /* codec AC97 IO access */
  305. int wm97xx_reg_read(struct wm97xx *wm, u16 reg);
  306. void wm97xx_reg_write(struct wm97xx *wm, u16 reg, u16 val);
  307.  
  308. /* aux adc readback */
  309. int wm97xx_read_aux_adc(struct wm97xx *wm, u16 adcsel);
  310.  
  311. /* machine ops */
  312. int wm97xx_register_mach_ops(struct wm97xx *, struct wm97xx_mach_ops *);
  313. void wm97xx_unregister_mach_ops(struct wm97xx *);
  314.  
  315. #endif
  316.